#include <time.h>
#include <string.h>
#include "timet.h"


/*
几个时间概念：
1：Coordinated Universal Time(UTC)：
协调世界时，又称世界标准时间，也即格林威治标准时间(Greenwich Mean Time,GMT)，
中国内地的时间与UTC得时差为+8，也即UTC+8，美国为UTC-5。

2：Calendar Time：
日历时间，是用"从一个标准时间点到此时的时间经过的秒数"来表示的时间。
标准时间点对不同编译器可能会不同，但对一个编译系统来说，标准时间是不变的。
一般是表示距离UTC时间 1970-01-01 00:00:00的秒数。

3：epoch：
时间点。在标准c/c++中是一个整数，用此时的时间和标准时间点相差的秒数（即日历时间）来表示。

4：clock tick：
时钟计时单元（而不叫做时钟滴答次数），一个时钟计时单元的时间长短是由cpu控制的，
一个clock tick不是cpu的一个时钟周期，而是c/c++的一个基本计时单位。
*/



/*localtime()函数用于获取 tm 结构形式的系统时间*/
//	struct tm
//	{
//    int tm_sec;  //秒
//    int tm_min;  //分
//    int tm_hour;  //小时（0~23）
//    int tm_mday;  //月中的日期（1~31）
//    int tm_mon;  //月（0~11）
//    int tm_year;  //年（不含世纪）
//    int tm_wday;  //一星期中指定一天（0~6）
//    int tm_yday;  //一年中指定一天（0~365）
//    int tm_isdst;  //夏令时（不作用则为0）
//	};



#define LABVIEW_TIME_OFFSET				2082816000	//1904年1月1日0时0分0秒
#define CHINA_UTC_OFFSET				28800		//28800/60/60=8小时

void get_time_str_usr_format(char *aac, int size, char *fmt)
{
	time_t timep;
	struct tm *pt;

	// 获取当前的系统时间，返回的结果是一个time_t类型，其实就是一个大整数
	time(&timep);
	pt = localtime(&timep);
	// strftime根据 format 中定义的格式化规则，格式化结构timeptr表示的时间，并把它存储在str中
	strftime(aac, size, fmt, pt);
}

void get_time_str_fixed_format1(char *aac)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = localtime(&timep);
	strftime(aac, 15, "%Y%m%d%H%M%S", pt);
}

void get_time_str_fixed_format2(char *aac)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = localtime(&timep);
	strftime(aac, 20, "%Y-%m-%d %H:%M:%S", pt);
}

void get_gtime_str_fixed_format1(char *aac)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = gmtime(&timep);
	strftime(aac, 15, "%Y%m%d%H%M%S", pt);
}

void get_gtime_str_fixed_format2(char *aac)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = gmtime(&timep);
	strftime(aac, 20, "%Y-%m-%d %H:%M:%S", pt);
}


/* 用time()取得时间（秒数），利用localtime()
转换成struct tm 再利用mktime（）将struct tm转换成原来的秒数*/
uint64_t get_time_dbc(void)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = localtime(&timep);
	/*mktime将时间转换为自1970年1月1日以来持续时间的秒数，发生错误时返回-1*/
	timep = mktime(pt);
	return (uint64_t)time(&timep);
}

time_t get_time_dblv(void)
{
	time_t timep;
	struct tm *pt;
	char tmzone[6] = "";

	time(&timep);
	pt = localtime(&timep);
	timep = mktime(pt);
	get_time_str_usr_format(tmzone, 5, "%Z");
	if(strcmp(tmzone, "UTC") == 0)
		return LABVIEW_TIME_OFFSET + time(&timep);
	else
		return LABVIEW_TIME_OFFSET + CHINA_UTC_OFFSET + time(&timep);
}

uint64_t get_gtime_dbc(void)
{
	time_t timep;
	struct tm *pt;

	time(&timep);
	pt = gmtime(&timep);
	timep = mktime(pt);
	return (uint64_t)time(&timep);
}

time_t get_gtime_dblv(void)
{
	time_t timep;
	struct tm *pt;
	char tmzone[6] = "";

	time(&timep);
	pt = gmtime(&timep);
	timep = mktime(pt);
	get_time_str_usr_format(tmzone, 5, "%Z");
	if (strcmp(tmzone, "UTC") == 0)
		return LABVIEW_TIME_OFFSET + time(&timep);
	else
		return LABVIEW_TIME_OFFSET + CHINA_UTC_OFFSET + time(&timep);
}

